td-agent2をAWS Elastic Beanstalkにデプロイする
ども、大瀧です。
Fluentdディストリビューションのtd-agent2が先日、Amazon Linuxに対応しました。ただ、Amazon Linuxのバージョン規則(releasever)の制約で管理者がバージョンを固定している場合および既定でバージョン固定になるElastic Beanstalkの場合でエラーになっていました。一昨日、バージョン固定の2015.03のリポジトリが整備されたため、晴れてBeanstalkで動くようになりました! *1感謝です!というわけで試した設定をご紹介します。
- OS : OS X Yosemite
- EB CLI : バージョン3.2.2
- サポートするEBコンテナ : コンテナバージョンv1.3以上(Dockerベースのコンテナは本日現在で未リリース)
.ebextensionsの設定
Elastic Beanstalkでは、アプリケーションファイル以外のシステム設定を変更する仕組みがあり、アプリケーションバンドルのルート以下に.ebextentionsというディレクトリを作成し、その中に*.configというYAMLもしくはJSON形式ファイルで記述します。複数ファイルの場合はASCII順に実行されるため、ファイル名の先頭を数字から始めるのが慣例です。今回は、td-agentの設定ファイル(/etc/td-agent/td-agent.conf)の配置とtd-agent2のパッケージインストールを行うので以下2つのファイルを作成します。
- 0-td-agent-gen-config.configファイルのcontent以下は通常のtd-agent.confの内容にYAMLのソフトインデントを加えたものなので、実際に使用したいtd-agent.confの内容に読み替えてください。
- 1-td-agent-install.configファイルは、インストールスクリプト内でsudoを実行しているので、Beanstalkからrootユーザーで実行できるよう、先にsudoの設定を変更しています。fluentdプラグインの追加など行う場合は、コマンド実行を追加して対応できます。
files: "/etc/td-agent/td-agent.conf": owner: root group: root content: | #### ## Output descriptions: ## # Treasure Data (http://www.treasure-data.com/) provides cloud based data # analytics platform, which easily stores and processes data from td-agent. # FREE plan is also provided. # @see http://docs.fluentd.org/articles/http-to-td # # This section matches events whose tag is td.DATABASE.TABLE <match td.*.*> type tdlog apikey YOUR_API_KEY_IS_HERE auto_create_table buffer_type file buffer_path /var/log/td-agent/buffer/td </match> :(以下略)
# errors get logged to /var/log/cfn-init.log. See Also /var/log/eb-tools.log commands: 01-command: command: echo 'Defaults:root !requiretty' >> /etc/sudoers 02-command: command: curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh 03-command: command: /etc/init.d/td-agent restart
事前準備はこれだけです!シンプルですね!
動作確認
では、動かしてみましょう。サンプルのRubyのBeanstalkアプリケーションバンドルに今回のファイルを追加したものがTreasureDataさんのGitHubで公開されているので、手っ取り早く試したい方はどうぞ。
$ git clone https://github.com/treasure-data/elastic-beanstalk-td-agent.git $ cd elastic-beanstalk-td-agent $ tree -a -I .git . ├── .ebextensions │ ├── 0-td-agent-gen-config.config │ └── 1-td-agent-install.config ├── Gemfile ├── README.md ├── config.ru └── helloworld.rb 1 directory, 6 files $
続いて、Elastic Beanstalkの構成を進めます。今回はEB CLI3を利用します。ローカルマシンにインストールしていない場合は、事前にpip install awsebcliでインストールし、AWS APIにアクセスするための設定を済ませておきましょう。eb initコマンドでBeanstalkの初期構成とApplication作成が実行されます。
$ eb init Enter Application Name (default is "elastic-beanstalk-td-agent"): Application elastic-beanstalk-td-agent has been created. It appears you are using Ruby. Is this correct? (y/n): y Select a platform version. 1) Ruby 2.2 (Puma) 2) Ruby 2.1 (Puma) 3) Ruby 2.0 (Puma) 4) Ruby 2.2 (Passenger Standalone) 5) Ruby 2.1 (Passenger Standalone) 6) Ruby 2.0 (Passenger Standalone) 7) Ruby 1.9.3 (default is 1): Do you want to set up SSH for your instances? (y/n): y Select a keypair. 1) XXXXXXXX 2) [ Create new KeyPair ] (default is 2): 1 $
続いて、eb createでEnvironment作成およびスタック構築、初期リビジョンのデプロイまで一気に進みます。
$ eb create Enter Environment Name (default is elastic-beanstalk-td-a): Enter DNS CNAME prefix (default is elastic-beanstalk-td-a): Creating application version archive "4605". Uploading elastic-beanstalk-td-agent/4605.zip to S3. This may take a while. Upload Complete. Environment details for: elastic-beanstalk-td-a Application name: elastic-beanstalk-td-agent Region: ap-northeast-1 Deployed Version: 4605 Environment ID: e-XXXXXXXXXX Platform: 64bit Amazon Linux 2015.03 v1.3.0 running Ruby 2.2 (Puma) Tier: WebServer-Standard CNAME: elastic-beanstalk-td-a.elasticbeanstalk.com Updated: 2015-04-15 12:26:10.917000+00:00 Printing Status: INFO: createEnvironment is starting. INFO: Using elasticbeanstalk-ap-northeast-1-XXXXXXXXXXXX as Amazon S3 storage bucket for environment data. INFO: Created security group named: sg-XXXXXXXX INFO: Created load balancer named: awseb-e-e-AWSEBLoa-XXXXXXXXXXXX INFO: Created security group named: awseb-e-eijimzmxnt-stack-AWSEBSecurityGroup-XXXXXXXXXXXX INFO: Created Auto Scaling launch configuration named: awseb-e-XXXXXXXXXX-stack-AWSEBAutoScalingLaunchConfiguration-XXXXXXXXXX INFO: Waiting for EC2 instances to launch. This may take a few minutes. INFO: Created Auto Scaling group named: awseb-e-eijimzmxnt-stack-AWSEBAutoScalingGroup-XXXXXXXXXXXX INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:scalingPolicy:a348c982-f77a-4369-9f2d-4fc4cca6a867:autoScalingGroupName/awseb-e-XXXXXXXXXXXX-stack-AWSEBAutoScalingGroup-XXXXXXXXXXXX:policyName/awseb-e-eijimzmxnt-stack-AWSEBAutoScalingScaleUpPolicy-XXXXXXXXXXXX INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:scalingPolicy:33178e1a-70a2-4621-8aef-3112de4f8b7c:autoScalingGroupName/awseb-e-XXXXXXXXXX-stack-AWSEBAutoScalingGroup-XXXXXXXXXXXX:policyName/awseb-e-XXXXXXXXX-stack-AWSEBAutoScalingScaleDownPolicy-XXXXXXXXXXXX INFO: Created CloudWatch alarm named: awseb-e-XXXXXXXXXX-stack-AWSEBCloudwatchAlarmHigh-XXXXXXXXXXXX INFO: Created CloudWatch alarm named: awseb-e-XXXXXXXXXXXX-stack-AWSEBCloudwatchAlarmLow-XXXXXXXXXXXX INFO: Added EC2 instance 'i-XXXXXXXX' to Auto Scaling Group 'awseb-e-XXXXXXXXXX-stack-AWSEBAutoScalingGroup-XXXXXXXXXXXX'. INFO: Application available at elastic-beanstalk-td-a.elasticbeanstalk.com. INFO: Successfully launched environment: elastic-beanstalk-td-a $
これで完了です!SSHで作成されたBeanstalkのインスタンスに接続し、td-agentがインストールされているか確認してみます。
[ec2-user@ip-10-0-0-XX ~]$ rpm -q td-agent td-agent-2.2.0-0.x86_64 [ec2-user@ip-10-0-0-XX ~]$ ps ax | grep td-agent 1718 ? Sl 0:00 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --use-v1-config --daemon /var/run/td-agent/td-agent.pid 1721 ? Sl 0:03 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --use-v1-config --daemon /var/run/td-agent/td-agent.pid 27013 pts/0 D+ 0:00 grep td-agent [ec2-user@ip-10-0-0-XX ~]$
td-agentの最新版2.2.0がインストール済みで、サービスが起動していることがわかりますね!
まとめ
td-agentのインストール手順がシンプルなおかげで、Beanstalkへの導入も容易に出来る様子がわかりました。AWSの他のデプロイサービスでも手順を整理したいところですね。td-agentをガシガシ活用していきましょう!